5 Анализ эффективности работы отдела продаж¶
(Sales Dept Efficiency Analys)
Загрузка модулей и функций¶
In [1]:
# load modules and functions
import os
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import ipywidgets as widgets
from IPython.display import display
from colorama import Fore, Back, Style
from datetime import time, timedelta
import My_Function_050824_M_Filimonov as mvf # loading functions written by me for the Project from a file
# load DataFrames:
spend = pd.read_pickle("03_spend.pkl")
deals = pd.read_pickle("04_deals.pkl")
5.1 Оцените эффективность отдельных владельцев сделок и рекламных кампаний с точки зрения количества обработанных сделок, коэффициента конверсии и общей суммы продаж.¶
5.1.1 Анализ эффективности менердеров продаж (владельцев сделок)¶
In [2]:
owners_stats = deals.groupby("Deal_Owner_Name",observed=False).agg(
Total_Deals=("Id", "count"),
Successful_Deals=("Stage", lambda x: (x == "Payment Done").sum()),
Revenue=("Paid", lambda x: x[deals["Stage"] == "Payment Done"].sum()) # Total sales amount
)
owners_stats["Conversion_Rate (%)"] = owners_stats["Successful_Deals"] / owners_stats["Total_Deals"] * 100
# Set float display format
pd.set_option('display.float_format', '{:,.2f}'.format)
pd.set_option("display.max_rows", 40)
print(Back.YELLOW + "\nSummary table of sales manager performance indicators" + Style.RESET_ALL)
display(owners_stats.sort_values(by="Conversion_Rate (%)", ascending=False))
Summary table of sales manager performance indicators
| Total_Deals | Successful_Deals | Revenue | Conversion_Rate (%) | |
|---|---|---|---|---|
| Deal_Owner_Name | ||||
| Oliver Taylor | 163 | 50 | 430,727.27 | 30.67 |
| Kevin Parker | 574 | 40 | 177,235.45 | 6.97 |
| Ulysses Adams | 2166 | 141 | 635,404.40 | 6.51 |
| John Doe | 20 | 1 | 0.00 | 5.00 |
| Charlie Davis | 2963 | 148 | 681,556.22 | 4.99 |
| Paula Underwood | 1862 | 93 | 390,481.51 | 4.99 |
| Julia Nelson | 2241 | 93 | 509,024.54 | 4.15 |
| Eva Kent | 460 | 18 | 32,143.02 | 3.91 |
| Nina Scott | 1283 | 46 | 206,605.76 | 3.59 |
| Victor Barnes | 1232 | 44 | 195,854.55 | 3.57 |
| Quincy Vincent | 1884 | 65 | 267,613.04 | 3.45 |
| Ben Hall | 1345 | 46 | 134,244.54 | 3.42 |
| Jane Smith | 988 | 31 | 195,053.19 | 3.14 |
| Cara Iverson | 1056 | 27 | 57,330.00 | 2.56 |
| George King | 109 | 2 | 5,760.00 | 1.83 |
| Ian Miller | 497 | 8 | 19,408.64 | 1.61 |
| Mason Roberts | 268 | 3 | 13,400.00 | 1.12 |
| Diana Evans | 1015 | 1 | 3,815.00 | 0.10 |
| Alice Johnson | 31 | 0 | 0.00 | 0.00 |
| Bob Brown | 340 | 0 | 0.00 | 0.00 |
| Amy Green | 66 | 0 | 0.00 | 0.00 |
| Sam Young | 67 | 0 | 0.00 | 0.00 |
| Rachel White | 871 | 0 | 0.00 | 0.00 |
| Wendy Clark | 2 | 0 | 0.00 | 0.00 |
| Xander Dean | 3 | 0 | 0.00 | 0.00 |
| Yara Edwards | 85 | 0 | 0.00 | 0.00 |
| Zachary Foster | 1 | 0 | 0.00 | 0.00 |
Визуализация индикаторов эффективности менеджеров продаж¶
In [3]:
# graph size and `subplot` (2 rows, 2 columns)
fig, ax = plt.subplots(2, 2, figsize=(14, 10))
# Color scheme (according to Feng Shui :)
colors = ["#3498db", "#2ecc71", "#9b59b6", "#e67e22"]
# Function for adding labels to bars
def add_labels(ax):
for bar in ax.patches:
ax.text(bar.get_width() + 0.1, bar.get_y() + bar.get_height()/2,
f'{int(bar.get_width())}', ha='left', va='center', fontsize=10, color="black")
# Function to remove the top and right frame (spines)
def remove_spines(ax):
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
# Total Deals
sns.barplot(y=owners_stats.index, x=owners_stats["Total_Deals"], ax=ax[0, 0], color=colors[0])
ax[0, 0].set_title("Total Deals by Deals Owner")
ax[0, 0].set_xlabel("")
ax[0, 0].set_ylabel("")
add_labels(ax[0, 0])
remove_spines(ax[0, 0])
# Successful Deals
sns.barplot(y=owners_stats.index, x=owners_stats["Successful_Deals"], ax=ax[0, 1], color=colors[1])
ax[0, 1].set_title("Successful Deals by Deals Owner")
ax[0, 1].set_xlabel("")
ax[0, 1].set_ylabel("")
add_labels(ax[0, 1])
remove_spines(ax[0, 1])
# Revenue
sns.barplot(y=owners_stats.index, x=owners_stats["Revenue"], ax=ax[1, 0], color=colors[2])
ax[1, 0].set_title("Revenue by Deals Owner")
ax[1, 0].set_xlabel("Revenue, €")
ax[1, 0].set_ylabel("")
add_labels(ax[1, 0])
remove_spines(ax[1, 0])
# Conversion Rate
sns.barplot(y=owners_stats.index, x=owners_stats["Conversion_Rate (%)"], ax=ax[1, 1], color=colors[3])
ax[1, 1].set_title("Conversion Rate (%) by Deals Owner")
ax[1, 1].set_xlabel("Conversion Rate (%)")
ax[1, 1].set_ylabel("")
add_labels(ax[1, 1])
remove_spines(ax[1, 1])
plt.tight_layout(h_pad=3)
plt.show()
Визуализация эффективности владельцев сделок, которые имеют не нулевую конверсию¶
In [14]:
import plotly.express as px
# Filter owners with conversion > 0
owners_stats = owners_stats[owners_stats["Conversion_Rate (%)"] > 0]
# create scatterplot
fig = px.scatter(
owners_stats,
x="Successful_Deals",
y="Revenue",
color="Conversion_Rate (%)",
size="Conversion_Rate (%)",
hover_name=owners_stats.index, # Подписи при наведении
text=owners_stats.index, # Подписи на графике
color_continuous_scale="RdYlGn",
title="Deal Owner Efficiency (Conversion Rate > 0%)",
labels={"Total_Deals": "Total Deals", "Successful_Deals": "Successful Deals",
"Conversion_Rate (%)": "Conversion Rate (%)", "Revenue": "Revenue (€)"} #Adding a Y-axis label
)
# set up the owner labels (font size 7, closer to the point)
fig.update_traces(
textposition="top right", # Размещаем подписи ближе к точке
textfont=dict(size=7, color="black"), # Уменьшаем размер шрифта
marker=dict(line=dict(width=1, color="black")) # Граница точек
)
# set up color scale
fig.update_layout(coloraxis_colorbar=dict(title="Conversion Rate (%)"))
fig.show()
Результаты анализа эффективности менеджеров продаж:¶
ТОП-5 менеджеров по успешным сделкам и доходу¶
| Имя | Успешные сделки | Доход (€) | Конверсия (%) |
|---|---|---|---|
| Charlie Davis | 148 |
681,556.22 |
4.99 |
| Ulysses Adams | 141 |
635,404.40 |
6.51 |
| Oliver Taylor | 50 |
430,727.27 |
30.67 |
| Paula Underwood | 93 |
390,481.51 |
4.99 |
| Julia Nelson | 93 |
509,024.54 |
4.15 |
Менеджеры с наименьшими показателями¶
| Имя | Успешные сделки | Доход (€) | Конверсия (%) |
|---|---|---|---|
| Diana Evans | 1 |
3,815.00 |
0.10 |
| George King | 2 |
5,760.00 |
1.83 |
| Ian Miller | 8 |
19,408.64 |
1.61 |
| Alice Johnson | 0 |
0.00 |
0.00 |
| Bob Brown | 0 |
0.00 |
0.00 |
Основные выводы¶
- Оливер Тейлор обладает самым высоким коэффициентом конверсии (30.67%), но у него сравнительно небольшое количество сделок.
- Чарли Дэвис и Улисс Адамс лидируют по количеству успешных сделок и совокупному доходу.
- Менеджеры с нулевой конверсией (например, Алиса Джонсон, Боб Браун) возможно не участвуют в активных продажах или требуют дополнительного обучения.
- Низкие показатели успешности (0-1 сделки) требуют анализа: возможно, есть сложности с закрытием или отсутствует проработанная стратегия.
Рекомендации по повышению результативности отдела продаж.¶
- Оптимизировать работу менеджеров с низкой конверсией, выявить причины отказов и предложить дополнительные инструменты продаж.
- Проанализировать эффективность Оливера Тейлора, изучить его методы работы и распространить среди других менеджеров.
- Усилить стратегию по увеличению количества сделок у топ-менеджеров (Дэвис, Адамс, Тейлор) для масштабирования успешных подходов.
- Пересмотреть работу менеджеров с нулевыми продажами, определить, нужна ли им дополнительная поддержка или перераспределение задач.
5.1.2 Анализ эффективности рекламных кампаний¶
In [5]:
campaign_stats = deals.groupby("Campaign",observed=False).agg(
Total_Deals=("Id", "count"),
Successful_Deals=("Stage", lambda x: (x == "Payment Done").sum()),
Revenue=("Paid", lambda x: x[deals["Stage"] == "Payment Done"].sum())
)
campaign_stats["Conversion_Rate (%)"] = campaign_stats["Successful_Deals"] / campaign_stats["Total_Deals"] * 100
# Объединяем с затратами на рекламу
campaign_stats = campaign_stats.merge(
spend.groupby("Campaign",observed=False)["Spend"].sum().reset_index(),
on="Campaign",
how="left"
)
campaign_stats["ROI(%)"] = (campaign_stats["Revenue"] - campaign_stats["Spend"]) / campaign_stats["Spend"]
# Fill missing closing duration values with 0
campaign_stats['ROI(%)'] = campaign_stats['ROI(%)'].fillna(0)
campaign_stats['Spend'] = campaign_stats['Spend'].fillna(0)
# Set float display format
pd.set_option('display.float_format', '{:,.2f}'.format)
pd.set_option("display.max_rows", 20)
campaign_stats = campaign_stats[campaign_stats.Campaign != "unknown"]
campaign_stats = campaign_stats.sort_values(by="Revenue", ascending=False)
print(Back.YELLOW + "\nSummary table of Campaign performance indicators" + Style.RESET_ALL)
display(campaign_stats)
Summary table of Campaign performance indicators
| Campaign | Total_Deals | Successful_Deals | Revenue | Conversion_Rate (%) | Spend | ROI(%) | |
|---|---|---|---|---|---|---|---|
| 118 | performancemax_digitalmarkt_ru_DE | 2653 | 112 | 570,485.31 | 4.22 | 0.00 | 0.00 |
| 2 | 02.07.23wide_DE | 975 | 52 | 291,282.27 | 5.33 | 6,913.60 | 41.13 |
| 152 | youtube_shorts_DE | 1635 | 53 | 241,093.49 | 3.24 | 14,149.22 | 16.04 |
| 18 | 12.07.2023wide_DE | 1575 | 48 | 208,790.00 | 3.05 | 9,471.52 | 21.04 |
| 4 | 03.07.23women | 612 | 31 | 179,658.18 | 5.07 | 4,219.75 | 41.58 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 146 | welt_DE | 2 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 149 | work_wr | 6 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 150 | workingin_DE | 48 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 151 | yo_DE | 13 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 153 | youtube_shortsin_AT | 14 | 0 | 0.00 | 0.00 | 249.28 | -1.00 |
154 rows × 7 columns
In [15]:
# total_campaign = campaign_stats.shape[0]
# # Graphics update function
# def update_chart(top_n):
# df = campaign_stats.sort_values(by="Revenue", ascending=False).head(top_n)
# fig = px.bar(df,
# y='Revenue',
# x='Campaign',
# orientation="v",
# title=f"Top {top_n} (from {total_campaign}) Campaign by Revenue",
# text_auto=True)
# fig.show()
# # Creating an interactive slider to select the number of campaigns
# top_n_selector = widgets.IntSlider(
# value=15, # Default value
# min=5,
# max=50,
# step=5,
# description="Top N:"
# )
# widgets.interactive(update_chart, top_n=top_n_selector)
In [17]:
# for REPORT without interactive slider
total_campaign = campaign_stats.shape[0]
# Graphics update function
top_n = 15
df = campaign_stats.sort_values(by="Revenue", ascending=False).head(top_n)
fig = px.bar(df,
y='Revenue',
x='Campaign',
orientation="v",
title=f"Top {top_n} (from {total_campaign}) Campaign by Revenue",
text_auto=True)
fig.show()
Результаты анализ эффективности рекламных кампаний:¶
Лидеры по доходу (Revenue)¶
| Кампания | Сделки | Успешные сделки | Доход (€) | Конверсия (%) | ROI (%) |
|---|---|---|---|---|---|
| performancemax_digitalmarkt_ru_DE | 2653 | 112 | 570,485.31 | 4.22% | 0.00% |
| 02.07.23wide_DE | 975 | 52 | 291,282.27 | 5.33% | 41.13% |
| youtube_shorts_DE | 1635 | 53 | 241,093.49 | 3.24% | 16.04% |
| 12.07.2023wide_DE | 1575 | 48 | 208,790.00 | 3.05% | 21.04% |
| 03.07.23women | 612 | 31 | 179,658.18 | 5.07% | 41.58% |
Выводы
- performancemax_digitalmarkt_ru_DE лидирует по доходу (570K €), но у нее отсутствуют данные о расходах, поэтому невозможно рассчитать ROI.
- 02.07.23wide_DE имеет высокий доход (291K €) и ROI 41.13%, что делает ее успешной.
- youtube_shorts_DE имеет значительный доход (241K €), но ROI ниже (16.04%), что может говорить о высоких затратах.
- 03.07.23women показывает хорошую конверсию (5.07%) и ROI 41.58%.
Лучшие кампании по конверсии (Conversion Rate)¶
| Кампания | Конверсия (%) | Доход (€) | ROI (%) |
|---|---|---|---|
| hanna | 100% | 8,000.00 | 0.00% |
| domain | 100% | 833.33 | 0.00% |
| referral | 33.33% | 4,000.00 | 0.00% |
| web2311_DE | 30.00% | 12,858.18 | 0.00% |
Выводы
- hanna и domain показывают 100% конверсию, но у них нет данных о расходах, поэтому ROI невозможно оценить.
- referral (33.33%) и web2311_DE (30%) также демонстрируют высокий уровень успешных сделок без вложений в рекламу.
- Эти кампании могут быть органическими источниками клиентов, что стоит учитывать при планировании маркетинга.
Лучшие кампании по ROI (Return on Investment)¶
| Кампания | ROI (%) | Доход (€) | Конверсия (%) |
|---|---|---|---|
| web2408_DE | 153.41% | 31,795.00 | 3.80% |
| 18.10.23wide_gos_DE | 54.37% | 18,000.00 | 4.76% |
| 02.07.23wide_DE | 41.13% | 291,282.27 | 5.33% |
Выводы
- web2408_DE демонстрирует невероятно высокий ROI (153.41%) — сверхэффективная реклама с минимальными затратами (205.91 €).
- 18.10.23wide_gos_DE также имеет хороший ROI (54.37%) при сравнительно небольшом доходе.
- 02.07.23wide_DE — одна из самых прибыльных кампаний по доходу и ROI.
Убыточные кампании (ROI < 0%)¶
| Кампания | ROI (%) | Доход (€) | Расходы (€) |
|---|---|---|---|
| performancemax_eng_DE | -0.94% | 2,000.00 | 34,183.45 |
| discovery_DE | -0.49% | 5,000.00 | 9,750.63 |
| 01.04.23women_PL | -1.00% | 0.00 | 357.25 |
Выводы
- performancemax_eng_DE убыточна: вложенные средства в 34K € не принесли прибыли.
- discovery_DE тоже в минусе, имея низкий доход при значительных расходах (9.75K €).
- Некоторые кампании вообще не получили дохода, но имели расходы (например, 01.04.23women_PL).
Кампании без успешных сделок (0% конверсия)¶
| Кампания | Сделки | Конверсия (%) | Расходы (€) |
|---|---|---|---|
| blog_DE | 3 | 0% | 0.00 |
| forum_DE | 5 | 0% | 0.00 |
| jobs_germany_DE | 7 | 0% | 0.00 |
| genie_DE | 12 | 0% | 0.00 |
Выводы
- blog_DE, forum_DE, jobs_germany_DE, genie_DE — 0% конверсии и 0 € дохода.
- Эти кампании могли быть неправильно настроены или ориентированы не на ту аудиторию.
- Рекомендация: Провести аудит и определить причины низкой эффективности.
Общие выводы и рекомендации¶
- Увеличить инвестиции в кампании с высоким ROI (web2408_DE, 02.07.23wide_DE, 18.10.23wide_gos_DE).
- Пересмотреть стратегию убыточных кампаний, возможно, требуется изменить таргетинг или предложение (performancemax_eng_DE, discovery_DE).
- Проанализировать органические кампании (hanna, referral, domain, web2311_DE), чтобы усилить их эффективность без вложений в рекламу.
- Оптимизировать расходы на кампании с высоким доходом, но низким ROI (например, youtube_shorts_DE).
- Удалить или полностью изменить кампании, которые не приносят дохода, но требуют затрат (например, 01.04.23women_PL).
- Аудит кампаний с нулевыми конверсиями (blog_DE, forum_DE, jobs_germany_DE, genie_DE) — возможно, они настроены неэффективно.
Связь коэффициента конверсии и общей суммы продаж по кампаниям¶
In [7]:
# Удаляем строки с отсутствующими значениями
#campaign_stats.dropna(subset=["Conversion_Rate (%)", "Revenue"], inplace=True)
# Строим диаграмму рассеяния
plt.figure(figsize=(8, 5))
sns.scatterplot(x=campaign_stats["Conversion_Rate (%)"], y=campaign_stats["Revenue"], s=80, alpha=0.7)
plt.xlabel("Conversion Rate (%)")
plt.ylabel("Revenue (€)")
plt.title("Revenue and Conversion Rate Relationship")
plt.show()
Основные наблюдения:
- Концентрация данных в нижней части графика: большинство точек расположено в диапазоне 0-20% конверсии и 0-100,000€ продаж. -Это говорит о том, что большая часть кампаний имеет умеренную конверсию и средний объём продаж.
Выбросы и аномальные значения
- Есть один явный выброс с конверсией около 100% и общей суммой продаж ~190,000€.
- Это может быть специфическая кампания, где малый объём сделок даёт высокий процент конверсии.
Общий тренд
- Если точки сгруппированы вдоль восходящей линии, это означает, что увеличение конверсии приводит к росту продаж.
- Если точки хаотично расположены, значит, конверсия не всегда коррелирует с продажами, возможно, есть другие влияющие факторы.
Выводы и рекомендации:
- Анализировать выбросы → понять, почему одна кампания значительно превышает другие по показателям.
- Оценить эффективность низкоконверсионных кампаний → улучшить таргетинг, тестировать новые стратегии.
- Построить регрессионную модель → чтобы лучше понять, насколько конверсия влияет на продажи.
Анализ степени влияния коэффициент конверсии (Conversion Rate) на доход (Revenue)¶
Для этого построим регрессионную модель, которая поможет выявить, насколько коэффициент конверсии влияет на доход.
Выберем модель линейной регрессии:
- Conversion_Rate - предикат
- Revenue - целевая переменная
Шаги анализа:
- Подготовить данные → убрать пропущенные значения.
- Выполнить регрессионный анализ → использовать LinearRegression из sklearn.
- Визуализировать зависимость → график с линией тренда.
- Оценить качество модели → коэффициент детерминации R².
In [8]:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
# Remove rows with missing values
#campaign_stats1 = campaign_stats.dropna(subset=["Conversion_Rate (%)", "Revenue"])
campaign_stats1 = campaign_stats
# define the predictor and target variable
X = campaign_stats1["Conversion_Rate (%)"].values.reshape(-1, 1)
y = campaign_stats1["Revenue"].values
# create train aтв model
model = LinearRegression()
model.fit(X, y)
# Predicting values
y_pred = model.predict(X)
# Assessing the accuracy of the model (R²)
r2 = r2_score(y, y_pred)
print(Back.YELLOW + "\nModel Quality Assesment (coefficient R²):" + Style.RESET_ALL)
print(f"Determination Coefficient (R²): {r2:.4f}")
# visualisation
plt.figure(figsize=(8, 5))
sns.scatterplot(x=campaign_stats1["Conversion_Rate (%)"], y=campaign_stats1["Revenue"], color="blue", alpha=0.7)
plt.plot(campaign_stats1["Conversion_Rate (%)"], y_pred, color="red", linewidth=2, label="Trend line")
plt.xlabel(" Conversion Rate (%)")
plt.ylabel("Revenue (€)")
plt.title("Linear Regression: Conversion Rate on Revenue Impact")
plt.legend()
plt.show()
Model Quality Assesment (coefficient R²):
Determination Coefficient (R²): 0.0004
Вывод по регрессионному анализу
- Коэффициент детерминации (R²): 0.0009
- Это крайне низкое значение, означающее, что конверсия практически не объясняет изменения в доходе.
- Линейная регрессия предполагает наличие связи между коэффициентом конверсии и выручкой, но полученное значение R² показывает отсутствие сильной зависимости.
- Красная линия тренда на графике почти горизонтальна, что говорит о том, что изменения в коэффициенте конверсии не приводят к значительным изменениям дохода.
- Разброс точек → данные распределены хаотично, без явного линейного тренда, что дополнительно подтверждает слабую связь.
Что это означает для бизнеса?
- Конверсия — не единственный фактор влияния на доход → другие переменные (например, средний чек сделки, качество аудитории, маркетинговые расходы) могут играть более значительную роль.
- Следует проанализировать дополнительные факторы → сегментировать сделки по другим параметрам (средний размер сделки, источник клиентов).
Матрица корреляции рекламных метрик¶
In [9]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Выбираем числовые столбцы для анализа корреляции
corr_matrix = campaign_stats[["Total_Deals", "Successful_Deals", "Revenue", "Conversion_Rate (%)", "Spend", "ROI(%)"]].corr()
# Визуализация матрицы корреляции
plt.figure(figsize=(8, 5))
sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap="coolwarm", linewidths=0.5)
plt.title("Advertising Metrics Correlation Matrix")
plt.show()
На основе представленной матрицы корреляции рекламных метрик, можно выделить несколько ключевых наблюдений:
- Общая картина корреляций
- Вариативность значений от -1 (сильная отрицательная связь) до 1 (сильная положительная связь).
- 🔵 Холодные цвета (синие оттенки) → низкие значения.
- 🔴 Тёплые цвета (красные оттенки) → высокие значения.
- ⚪ Промежуточные (белый/светлый тон) → средние значения.
- Более светлые оттенки означают слабую корреляцию, а более насыщенные — сильную взаимосвязь.
- Основные выводы
- Сильная положительная корреляция между доходом (Revenue) и количеством успешных сделок (Successful_Deals). Это логично: больше успешных сделок приводит к большему доходу.
- Слабая или отрицательная корреляция между затратами (Spend), процентом возврата инвестиций (ROI) и конверсией (Conversion_Rate)
- Это означает, что увеличение затрат не всегда ведёт к росту конверсии (подтверждение вывода регрессионного анализа). Возможно, некоторые кампании неэффективны.
- ROI имеет положительную связь с доходом, но слабую с затратами. Это говорит о том, что увеличение бюджета не гарантирует рост ROI.
- Рекомендации
- Провести анализ эффективности затрат – найти кампании, где высокий бюджет не приводит к росту конверсии.
- Усилить фокус на качественных сделках – чем выше процент успешных сделок, тем выше доход.
- Перераспределить ресурсы – инвестировать в кампании с высоким ROI, а не просто увеличивать бюджет на рекламу.
Анализ взаимосвязи между затратами на маркетинг (Spend) и конверсией (Conversion Rate)¶
In [10]:
# Строим график с регрессионной линией
plt.figure(figsize=(8, 5))
sns.regplot(x=campaign_stats["Spend"], y=campaign_stats["Conversion_Rate (%)"], scatter_kws={"s": 50}, line_kws={"color": "red"})
plt.xlabel("Spend (€)")
plt.ylabel("Conversion Rate (%)")
plt.title("Relationship between Spend and Conversion Rate (with Regression Line)")
plt.show()
Распределение точек
- Большинство данных сконцентрировано в нижней части графика, где конверсия <5%, даже при значительных расходах.
- Некоторые точки выбиваются из общего тренда – они показывают конверсию выше 10-15%, что может говорить о более эффективных кампаниях.
Тренд
- общая тенденция
- линия близка к горизонтальной, что означает слабую или отсутствующую связь между затратами и конверсией;
- при этом просматривается слабый отрицательный наклон линии тренда, что можно интерпретировать как "больше расходов не приводит к улучшению конверсии", возможно, есть проблемы с таргетингом или качеством аудитории.
Выбросы и аномалии
- свидетельствуют о наличии кампаний с высокими затратами, но низкой конверсией — это повод пересмотреть стратегию.
- и наоборот, кампании с высокой конверсией при небольших затратах — отличный пример эффективного использования бюджета.
Кампании, где высокий бюджет не приводит к росту конверсии¶
Критерии отбора:
- Высокие затраты – кампании с Spend > среднего значения
- Низкая конверсия – кампании с Conversion_Rate < среднего значения.
- ROI < 1
In [11]:
# Calculate median values
mean_spend = campaign_stats["Spend"].mean()
mean_conversion = campaign_stats["Conversion_Rate (%)"].mean()
print(f"mean_spend: {mean_spend:.2f} €")
print(f"mean_conversion: {mean_conversion:.2f}")
mean_spend: 776.21 € mean_conversion: 4.48
In [12]:
# Filter campaigns with low costs and high conversions
high_efficiency_campaigns = campaign_stats[(campaign_stats["Spend"] > mean_spend) &
(campaign_stats["Conversion_Rate (%)"] < mean_conversion) &
(campaign_stats["ROI(%)"] < 1)]
print(Back.YELLOW + "\nCampaigns with low Spend budgets and high Conversion Rates (sort by Convtrsion Rate)" + Style.RESET_ALL)
display(high_efficiency_campaigns[["Campaign", "Spend", "Conversion_Rate (%)", "ROI(%)"]].sort_values(by="Conversion_Rate (%)", ascending=False))
Campaigns with low Spend budgets and high Conversion Rates (sort by Convtrsion Rate)
| Campaign | Spend | Conversion_Rate (%) | ROI(%) | |
|---|---|---|---|---|
| 88 | discovery_DE | 9,750.63 | 2.13 | -0.49 |
| 29 | 1performancemax_wide_PL | 2,961.38 | 1.53 | 0.84 |
| 119 | performancemax_eng_DE | 34,183.45 | 0.41 | -0.94 |
| 89 | discovery_wide1_AT | 1,308.18 | 0.00 | -1.00 |
Что делать с этими кампаниями?
- Аудит стратегии: проверить настройки таргетинга, аудитории и рекламных объявлений.
- Перераспределение бюджета: возможно, средства стоит направить в более успешные кампании.
- А/B тестирование: попробовать разные варианты креативов и форматов.
Кампании с низкими затратами, но высокой конверсией¶
Выявление таких кампаний поможет выявить наиболее эффективные рекламные стратегии
Критерии отбора:
- Низкие затраты – кампании с Spend < среднего значения
- Высокая конверсия – кампании с Conversion_Rate > среднего значения
- ROI > 1
In [13]:
# Filter campaigns with low costs and high conversions
high_efficiency_campaigns = campaign_stats[(campaign_stats["Spend"] < mean_spend) &
(campaign_stats["Conversion_Rate (%)"] > mean_conversion) &
(campaign_stats["ROI(%)"] > 1)]
print(Back.YELLOW + "\nCampaigns with low Spend budgets and high Conversion Rates (sort by Convtrsion Rate)" + Style.RESET_ALL)
display(high_efficiency_campaigns[["Campaign", "Spend", "Conversion_Rate (%)", "ROI(%)"]].sort_values(by="Conversion_Rate (%)", ascending=False))
Campaigns with low Spend budgets and high Conversion Rates (sort by Convtrsion Rate)
| Campaign | Spend | Conversion_Rate (%) | ROI(%) | |
|---|---|---|---|---|
| 7 | 05.09.2023wide_DE | 244.51 | 16.67 | 43.99 |
| 35 | 20.05.24wide_DE | 76.72 | 12.50 | 38.10 |
| 22 | 15.03.2024wide_AT | 425.01 | 9.09 | 3.19 |
| 28 | 18.10.23wide_gos_DE | 325.10 | 4.76 | 54.37 |
| 39 | 24.07.2023wide_DE | 280.35 | 4.55 | 14.34 |
Что делать с этими кампаниями?
- Масштабировать успешные стратегии – увеличить бюджет на кампании с доказанной эффективностью.
- Анализ аудитории – какие сегменты срабатывают лучше при минимальных затратах?
- Применить успешные методы к другим кампаниям – использовать подход из этих кампаний в других рекламных активностях.